//package com.ys.common.verticle;
//
//import ServiceName;
//import com.ys.common.mq.EventMQ;
//import com.ys.common.socket.SocketData;
//import io.vertx.core.AsyncResult;
//import io.vertx.core.Future;
//import io.vertx.core.json.JsonObject;
//import io.vertx.core.shareddata.AsyncMap;
//import io.vertx.core.shareddata.SharedData;
//import io.vertx.servicediscovery.Record;
//
//import java.util.HashMap;
//import java.util.Map;
//import java.util.function.BiConsumer;
//
///**
// * Created by taotao on 2017/2/24.
// */
//public abstract class BasicSocketVerticle extends BasicMicroServiceVerticle {
//
//    // protected MongoClient mongoClient;
//    //protected RedisClient redisClient;
//
//
//    //protected DataAccess dataAccess;
//    //protected ContentReader contentReader;
//    protected SharedData shareData;
//
//    /**
//     * msg id和处理函数的对应关系
//     */
//    protected Map<Short, BiConsumer<SocketData, Future<SocketData>>> handlerMap = new HashMap<>();
//
//
//    /**
//     * event mq的发送地址
//     *
//     * @return
//     */
//    protected String address() {
//        return getClass().getSimpleName() + "EventAddress";
//    }
//
//    /**
//     * 服务发现中的名称
//     *
//     * @return
//     */
//    protected abstract String name();
//
//
//    /**
//     * 发布gateway
//     *
//     * @param host
//     * @param port
//     * @return
//     */
//    protected Future<Void> publishApiGateway(String host, int port) {
//        Record record = new Record().setType("tcp-server").setLocation(new JsonObject().put("host", host).put("port", port)).setName("api gateway");
//        return publish(record);
//    }
//
//
//    private Future<String> getValue(String socketId, String mapName) {
//        Future<String> future = Future.future();
//        if (vertx.isClustered()) {
//            shareData.<String, String>getClusterWideMap(mapName, res -> {
//                if (res.succeeded()) {
//                    AsyncMap<String, String> map = res.result();
//                    map.get(socketId, as -> {
//                        if (as.succeeded()) {
//                            future.complete(as.result());
//                        } else {
//                            logger.error(as.cause());
//                            future.fail(as.cause());
//                        }
//                    });
//                } else {
//                    logger.error(res.cause());
//                    future.fail(res.cause());
//                }
//            });
//        } else {
//            String userId = shareData.<String, String>getLocalMap(mapName).get(socketId);
//            future.complete(userId);
//        }
//
//        return future;
//    }
//
//   /* protected Future<Void> setStarId(String socketId, String starId) {
//        return this.setValue(socketId, starId, "starIdMap");
//    }
//
//    protected Future<Void> setUserId(String socketId, String userId) {
//        return this.setValue(socketId, userId, "userIdMap");
//    }*/
//
//    private Future<Void> setValue(String socketId, String value, String mapName) {
//        Future<Void> future = Future.future();
//        if (vertx.isClustered()) {
//            shareData.<String, String>getClusterWideMap(mapName, res -> {
//                if (res.succeeded()) {
//                    AsyncMap<String, String> map = res.result();
//                    map.put(socketId, value, as -> {
//                        if (as.succeeded()) {
//                            System.out.println("set cluster map id to share data");
//                            future.complete();
//                        } else {
//                            logger.error(as.cause());
//                            future.fail(as.cause());
//                        }
//                    });
//                } else {
//                    logger.error(res.cause());
//                    future.fail(res.cause());
//                }
//            });
//        } else {
//            shareData.<String, String>getLocalMap(mapName).put(socketId, value);
//            System.out.println("set local map id to share data");
//            future.complete();
//        }
//
//        return future;
//    }
//
//   /* protected void initStoreClient() {
//        mongoClient = MongoClient.createShared(vertx, new JsonObject().put("host", config().getString("mongo_host", "127.0.0.1")).put("port", config().getInteger("mongo_port", 27017)).put("db_name", config().getString("mongo_name", "idol_server")));
//        RedisOptions config = new RedisOptions().setHost(config().getString("redis_host", "127.0.0.1")).setPort(config().getInteger("redis_port", 6379));
//        redisClient = RedisClient.create(vertx, config);
//      //  dataAccess = DataAccess.getInstance(mongoClient, redisClient);
//       // contentReader = ContentReader.getInstance(vertx, config());
//    }*/
//
//
//    /**
//     * 初始化msg id和处理函数的对应关系
//     */
//    protected abstract void initDispatcher();
//
//    @Override
//    public void start() throws Exception {
//        super.start();
//        EventMQ eventMQ = EventMQ.getApiEventMQ(vertx);
//        eventMQ.consumer(address(), (reqData, future) -> handlerRequest(reqData, future));
//        initDispatcher();
//        //initStoreClient();
//        shareData = vertx.sharedData();
//        publishService(name(), address());
//    }
//
//    protected void handlerRequest(SocketData reqSocketData, Future<SocketData> respFuture) {
//        BiConsumer<SocketData, Future<SocketData>> consumer = handlerMap.get(reqSocketData.getMsgId());
//        logger.info("dispatch to function - msg id:" + reqSocketData.getMsgId());
//        consumer.accept(reqSocketData, respFuture);
//    }
//
//
//    /**
//     * 发送服务之间的异步调用
//     *
//     * @param reqSocketData
//     * @return
//     */
//    protected Future<SocketData> interService(SocketData reqSocketData) {
//        Future future = Future.future();
//        discovery.getRecord(r -> r.getName().equals(ServiceName.interServiceNameMap.get(reqSocketData.getMsgId())), ar -> {
//            if (ar.succeeded()) {
//                if (ar.result() != null) {
//                    Record record = ar.result();
//                    String address = record.getLocation().getString("address");
//                    EventMQ eventMQ = EventMQ.getInterEventMQ(vertx);
//                    eventMQ.send(address, reqSocketData, respData -> future.complete(respData));
//                } else {
//                    System.out.print("inter service:no match service verticle address");
//                    future.fail("inter service:no match service verticle address");
//                }
//            } else {
//                System.out.print("lookup discovery record failed");
//                future.fail(ar.cause());
//            }
//        });
//        return future;
//    }
//
//
//
//    protected void completeSocketDataFuture(Future<SocketData> respFuture, short msgId, byte[] bytes) {
//        respFuture.complete(SocketData.buildWithPbData((short) msgId
//                , bytes));
//    }
//}
